package com.gradumate.server;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.gradumate.shared.Gebruiker;
import com.gradumate.shared.LoginToken;

/**
 * Classe die gaat communiceren met een setje PHP scripts om deze zo email te gaan sturen.
 * @author Hugo Zonderland
 *
 */
public class MailCommunicator {
	
	// Locatie van alle mailscripts
	private static String mail = "http://hugozonderland.nl/alfrescomailer/";
	
	// Logger
	private static final Logger log = Logger.getLogger(MailCommunicator.class.getName());
	
	/**
	 * Stuurt een mail naar de studieadviseur
	 * @param LoginToken tl token die gebruikt word voor het verzenden van de email
	 * @param Gebruiker studieAdviseur, studie adviseur aan wie gemailed word.
	 */
	public static boolean sendAfstudeerVerzoekBeoordelenEmail(LoginToken tl, Gebruiker studieAdviseur) {
		// Strings bepalen
		String ontvangerEmail = studieAdviseur.getGebruikerEmail();
		String ontvangerNaam = studieAdviseur.getVoornaam();
		String tokenUrl = "&u=" + AlfrescoInfo.HOSTNAME + "t=" + tl.getToken() + "&e=" + tl.getGebruikerEmail();	
		log.info("Token URL " + tokenUrl);
		
		// Uiteindelijke aanroep URL
		String scriptUrl = mail + "sendAfstudeerVerzoekTokenEmail.php?r=" + ontvangerEmail + "&n=" + ontvangerNaam + tokenUrl;
		log.info("ScriptURL: " + scriptUrl);
		
		// Verzenden!
		return send(scriptUrl);
	}
	
	/**
	 * Stuurt een email naar de student wanneer zijn verzoek is beoordeeld
	 * @param student
	 * @param studieAdviseur
	 * @param beoordeling
	 * @param motivatie
	 * @return
	 */
	public static boolean sendAfstudeerVerzoekBeoordelingEmailStudent(Gebruiker student, Gebruiker studieAdviseur, boolean beoordeling, String motivatie) {
		// Strings bepalen
		String ontvangerEmail = student.getGebruikerEmail();
		String ontvangerNaam = student.getVoornaam();
		String studieadviseurEmail = studieAdviseur.getGebruikerEmail();
		String beoordelingTxt = "goed gekeurd";
		if (!beoordeling) beoordelingTxt = "afgekeurd";
		
		// URL om aan te roepen
		String scriptUrl = mail + "sendAfstudeerVerzoekBeoordelingEmailStudent.php?r=" + ontvangerEmail + "&n=" + ontvangerNaam + "&b=" + beoordelingTxt + "&m=" + motivatie + "&s=" + studieadviseurEmail;
		log.info("ScriptURL: " + scriptUrl);
		
		// Verzenden!
		return send(scriptUrl);
	}
	
	/**
	 * Stuurt een email naar alle leden van een bepaalde examencommissie om aan te geven dat het voorstel van een student mag worden beoordeeeld.
	 * @param Gebruiker student waar het om gaat
	 * @param ArrayList<Gebruiker> commissieleden die een email moeten ontvangen
	 * @param Gebruiker studieAdviseur die de beoordeling heeft ingevuld.
	 * @return true wanneer alle emails zijn verstuurd.
	 */
	public static boolean sendAfstudeerVerzoekBeoordelingEmailCommissie(Gebruiker student, ArrayList<Gebruiker> commissieleden, Gebruiker studieAdviseur) {
		// Strings bepalen
		String studieAdviseurNaam = studieAdviseur.getVoornaam() + " " + studieAdviseur.getAchternaam();
		String studentNaam = student.getVoornaam() + " " + student.getAchternaam();
		String studentNummer = student.getStudentNummer() + "";
		boolean r = false;
		
		// Door de commissieleden heen loopen en voor ieder van hun een token aanmaken
		for (Gebruiker commissielid : commissieleden) {
			
			// Alleen verzenden als het commissielid aan heeft gegeven dat hij mail wilt ontvangen.
			if (commissielid.isMailOntvangen()) {
				
				// Strings bepalen
				String ontvangerNaam = commissielid.getVoornaam() + " " + commissielid.getAchternaam();
				String ontvangerEmail = commissielid.getGebruikerEmail();
				
				// LoginToken aanmaken
				LoginToken lt = LoginTokenGenerator.getLoginToken(commissielid, student, 1);
				String tokenUrl = "&u=" + AlfrescoInfo.HOSTNAME + "t=" + lt.getToken() + "&e=" + lt.getGebruikerEmail();
				
				// URL om aan te roepen
				String scriptUrl = mail + "sendAfstudeerVerzoekBeoordelingEmailCommissie.php?r=" + ontvangerEmail + "&n=" + ontvangerNaam + "&stn=" + studentNaam + "&stnu=" + studentNummer + "&st=" + studieAdviseurNaam + tokenUrl;
				log.info("ScriptURL: " + scriptUrl);
				
				// Verzenden!
				r = send(scriptUrl);
				log.info("Email is verzonden? " + r);
			}
		}
		
		return r;
	}
	
	/**
	 * Stuurt een email naar de student met de beoordeling van zijn voorstel
	 * @param Gebruiker student die gemailed word
	 * @param Gebruiker commisssielid die de beoordeling ingevuld heeft
	 * @param Boolean beoordeling geaccepteerd/
	 * @param String motivatie waarom een voorstel is afgekeurd/punten te verbeteren.
	 * @return
	 */
	public static boolean sendAfstudeerVoorstelBeoordelingEmailStudent(Gebruiker student, Gebruiker commisssielid, boolean beoordeling, String motivatie) {
		// Strings bepalen
		String ontvangerEmail = student.getGebruikerEmail();
		String ontvangerNaam = student.getVoornaam();
		String commissielidEmail = commisssielid.getGebruikerEmail();
		String beoordelingTxt = "goed gekeurd";
		if (!beoordeling) beoordelingTxt = "afgekeurd";
		
		// URL om aan te roepen
		String scriptUrl = mail + "sendAfstudeerVoorstelBeoordelingEmailStudent.php?r=" + ontvangerEmail + "&n=" + ontvangerNaam + "&b=" + beoordelingTxt + "&m=" + motivatie + "&c=" + commissielidEmail;
		log.info("ScriptURL: " + scriptUrl);
		
		// Verzenden!
		return send(scriptUrl);
	}

	/**
	 * Verstuur de uiteindelijk email. Op de externe host word true/false gegeven of het verzenden is gelukt.
	 * @param String url die aangeroepen word
	 * @return waarde van externe host
	 */
	private static boolean send(String url) {
		HttpClient http = new HttpClient();
		String returnValue = http.getFromUrl(url);
		log.info("Mailsend: " + returnValue);
		return returnValue.equals("true");
	}
	
	
}
